/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ModulHåndtering;

import java.util.ArrayList;
import jssc.SerialPort;
import jssc.SerialPortException;

/**
 *
 * @author Thor
 */
public abstract class Modul {

    protected SerialPort port;
    public ArrayList<Sensor> sensorList;
    public ArrayList<Controller> kontrollerList;
    public ArrayList<Integer> indstillingerVærdiList;
    public ArrayList<String> indstillingerList;
    public String navn;
    public String serielData;

    public ArrayList<String> getIndstilingerList() {
        return indstillingerList;
    }

    public void setIndstilling(int index, int værdi) {
        indstillingerVærdiList.set(index, værdi);
    }

    protected void tømBuffer() {
        try {
            while (port.getInputBufferBytesCount() > 0) {
                port.readBytes();
            }
        } catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }

    /**
     * Formater string til FPGA kommunikationsprotokol
     *
     * @param s Må ikke være længere end 6 chars
     * @return
     */
    private String formatString(String s) {
        if (s.length() > Protokol.STRING_LENGTH + 2) {
            System.out.println("For lang");
        }

        while (s.length() < Protokol.STRING_LENGTH) {
            s = s + Protokol.NULL;
        }
        if (s.startsWith(Protokol.START_CMD) && s.endsWith(Protokol.SLUT_CMD)){
            return s;
        } else {
        return Protokol.START_CMD + s + Protokol.SLUT_CMD;
        }
    }

    protected void skrivSerial(String s) {
        try {
            port.writeString(formatString(s));
        } catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }

    protected String læsDataSerial() {
        String strData = "";
        boolean intetData = true;

        while (intetData) {
            try {
                try {
                    strData += new String(port.readBytes());
                } catch (NullPointerException e) {

                }
            } catch (SerialPortException ex) {
                System.out.println(ex);
            }
            if (strData.startsWith(Protokol.START_DATA)) {
                if (strData.endsWith(Protokol.SLUT_DATA)) {
                    intetData = false;
                    //System.out.println(strData);
                    return strData;
                } else {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                    }
                }
            } else {
                strData = null;
                break;
            }
        }
        return null;
    }

    protected void formatter(int i, String data) {
        int dataInt;
        sensorList.get(i).oversætData(data);
        dataInt = sensorList.get(i).grafData();
        sensorList.get(i).addData(dataInt);
        serielData = sensorList.get(i).formatData();
    }

    protected ArrayList<String> formatData(String data) {
        ArrayList<String> formattedData = new ArrayList<>();

        if (data != null) {
            //Hvis data input følger protokolstandarden, så gå videre
            if (data.startsWith(Protokol.START_DATA) && data.endsWith(Protokol.SLUT_DATA)) {
                for (String s : data.split(Protokol.START_DATA)) {
                    if (s.contains(Protokol.SLUT_DATA)) {
                        formattedData.add(s.substring(0, s.length() - 1));
                    }
                }
            } else { //Ellers return ingenting og smid det pågældende input væk
                return null;
            }
        }

        return formattedData;
    }

    @Override
    public String toString() {
        return (port.getPortName() + ": " + navn);
    }

    public abstract void serielDataEvent();

}
